package com.casic.rabbitmq.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

import java.io.IOException;


/**
 * Consumer Ack机制
 * 1.设置手动签收。acknowledge="manual"
 * 2.让监听器类实现MessageListener的子类ChannelAwareMessageListener
 * 3.若消息成功处理，则调用channal的basicAck（）签收
 * 3.若消息处理失败，则调用channal的basicNack（）拒绝签收，broker重新发送给consumer
 */
@Component
//public class AskListener implements MessageListener {
public class AskListener implements ChannelAwareMessageListener {
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {//1.接收消息
            System.out.println(new String(message.getBody()));

            //2.处理业务逻辑()
            System.out.println("处理业务逻辑");

           //int a = 5/0; //模拟错误

            //3.手动签收，参数（消息的标签（可以理解为主键），是否签收多条消息）
            channel.basicAck(deliveryTag, true);
        } catch (Exception e) {
            System.out.println("error");
            //4.拒绝签收，参数（消息的标签（可以理解为主键），是否多条消息，是否重回队列）
            channel.basicNack(deliveryTag,true,true);
        }

    }
}
